Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - [Java ee] Problema Junit5
Forum - Java - [Java ee] Problema Junit5

Avatar
Sevenjeak (Normal User)
Pro


Messaggi: 91
Iscritto: 03/01/2012

Segnala al moderatore
Postato alle 12:11
Martedì, 23/01/2018
Salve,

Sto in questo periodo studiarmi il Java EE, ho iniziato con le pagine jsp ed ora sto passando agli ejb, ho creato con eclipse ee un progetto enterplace, collegato ad un progetto ejb, dove all'interno ho creato le seguente interfacce per un session bean stateless ( interfaccia locale, remota e un'interfaccia comune ad entrambi, contenuti nel package first.stateles ):

Codice sorgente - presumibilmente Java

  1. package first.stateless;
  2.  
  3. public interface OperationInterface {
  4.         int sum(int... values);
  5.         int divide(int... values);
  6.         int subtract(int... values);
  7.         int multiply(int... values);
  8. }



Codice sorgente - presumibilmente Java

  1. package first.stateless;
  2.  
  3. import javax.ejb.Local;
  4.  
  5. @Local
  6. public interface OperationLocal extends OperationInterface{
  7.  
  8. }



Codice sorgente - presumibilmente Java

  1. package first.stateless;
  2.  
  3. import javax.ejb.Remote;
  4.  
  5. public interface OperationRemote extends OperationInterface {
  6.  
  7. }



Ed in fine ho creato il session bean ( sempre nello stesso package ):

Codice sorgente - presumibilmente Java

  1. package first.stateless;
  2.  
  3. import javax.ejb.Stateless;
  4. import javax.ejb.TransactionAttribute;
  5. import javax.ejb.TransactionAttributeType;
  6.  
  7. /**
  8.  * Session Bean implementation class Operation
  9.  */
  10. @Stateless(mappedName = "Operation")
  11. public class Operation implements OperationRemote, OperationLocal {
  12.  
  13.     /**
  14.      * Default constructor.
  15.      */
  16.     public Operation() {
  17.         // TODO Auto-generated constructor stub
  18.     }
  19.  
  20.         @Override
  21.         @TransactionAttribute(TransactionAttributeType.NEVER)
  22.         public int sum(int... values) {
  23.                 int result = 0;
  24.                
  25.                 for (int i = 0; i < values.length; i++) {
  26.                         result += values[i];
  27.                 }
  28.                
  29.                 return result;
  30.         }
  31.  
  32.         @Override
  33.         @TransactionAttribute(TransactionAttributeType.NEVER)
  34.         public int divide(int... values) {
  35.                 int result = 0;
  36.                
  37.                 for (int i = 0; i < values.length; i++) {
  38.                         result /= values[i];
  39.                 }
  40.                
  41.                 return result;
  42.         }
  43.  
  44.         @Override
  45.         @TransactionAttribute(TransactionAttributeType.NEVER)
  46.         public int subtract(int... values) {
  47.                 int result = 0;
  48.                
  49.                 for (int i = 0; i < values.length; i++) {
  50.                         result -= values[i];
  51.                 }
  52.                
  53.                 return result;
  54.         }
  55.  
  56.         @Override
  57.         @TransactionAttribute(TransactionAttributeType.NEVER)
  58.         public int multiply(int... values) {
  59.                 int result = 0;
  60.                
  61.                 for (int i = 0; i < values.length; i++) {
  62.                         result *= values[i];
  63.                 }
  64.                
  65.                 return result;
  66.         }
  67.  
  68. }



Come potete vedere anche da codice, i metodi della classe compiono semplici operazioni sui parametri passati.

Ora, provando a testarlo tramite una servlet in un progetto web ( ovviamente il progetto ejb è nel class-path del progetto ) richiamando l'interfaccia locale, mi funziona tutto correttamente, il problema è quando provo a testare l'interfaccia remota con JUnit5, tramite questa classe ( presente nel package test del progetto ejb ):

Codice sorgente - presumibilmente Java

  1. package test;
  2.  
  3. import static org.junit.jupiter.api.Assertions.*;
  4.  
  5. import java.util.Properties;
  6.  
  7. import javax.naming.Context;
  8. import javax.naming.InitialContext;
  9. import javax.naming.NamingException;
  10.  
  11. import org.junit.jupiter.api.AfterAll;
  12. import org.junit.jupiter.api.BeforeAll;
  13. import org.junit.jupiter.api.Test;
  14.  
  15. import first.stateless.OperationRemote;
  16. import junit.framework.TestCase;
  17.  
  18. class IntegrationTest {
  19.         private static Context initialContext;
  20.         private static OperationRemote remoteObject;
  21.        
  22.         @AfterAll
  23.         public static void init() throws NamingException {
  24.                 Properties jndiProperties = new Properties();
  25.                
  26.                 jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
  27.                 jndiProperties.put(Context.PROVIDER_URL, "http//localhost");
  28.                 initialContext = new InitialContext(jndiProperties);
  29.         }
  30.        
  31.         @Test
  32.         public void test() throws NamingException {
  33.                 remoteObject = (OperationRemote) initialContext.lookup("java:global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote");
  34.                
  35.                 TestCase.assertEquals(remoteObject.sum(10, 10), 20);
  36.         }
  37.        
  38.         @BeforeAll
  39.         public static void destroy() throws NamingException {
  40.                 /*initialContext.close();
  41.                 initialContext = null;*/
  42.         }
  43. }


Prima di eseguire, per evitare l'eccezione NoInitialContextFactory, mi sono scaricato da questo sito:

https://jar-download.com/?detail_search=a%3A"wildfly-naming ...

Il jar e tutte le dipendenze necessarie, inserendole tutte nel class-path del progetto.

Ho risolto l'eccezione NoInitialContextFactory, anche se, eseguendo il test mi fallisce, in fauler trace mi da le seguenti eccezioni:

Codice sorgente - presumibilmente Delphi

  1. java.lang.NullPointerException
  2.         at test.IntegrationTest.test(IntegrationTest.java:33)
  3.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  5.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  6.         at java.lang.reflect.Method.invoke(Unknown Source)
  7.         at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)
  8.         at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
  9.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167)
  10.         at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
  11.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
  12.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
  13.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
  14.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83)
  15.         at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
  16.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
  17.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
  18.         at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
  19.         at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
  20.         at java.util.Iterator.forEachRemaining(Unknown Source)
  21.         at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
  22.         at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
  23.         at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
  24.         at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
  25.         at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
  26.         at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
  27.         at java.util.stream.ReferencePipeline.forEach(Unknown Source)
  28.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
  29.         at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
  30.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
  31.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
  32.         at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
  33.         at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
  34.         at java.util.Iterator.forEachRemaining(Unknown Source)
  35.         at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
  36.         at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
  37.         at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
  38.         at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
  39.         at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
  40.         at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
  41.         at java.util.stream.ReferencePipeline.forEach(Unknown Source)
  42.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
  43.         at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
  44.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
  45.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
  46.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
  47.         at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
  48.         at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
  49.         at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
  50.         at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:82)
  51.         at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  52.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
  53.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
  54.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
  55.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)



Ora, ho capito che il problema è nella prima riga del metodo test(), ma non di cosa si tratta, come potrei risolvere?



PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:21
Mercoledì, 24/01/2018
initialContext non e' initializzato.

Non conosco molto bene questo testing framework, ma ad occhio il problema e' qui:

Codice sorgente - presumibilmente Java

  1. @AfterAll
  2.         public static void init() throws NamingException {
  3.                 Properties jndiProperties = new Properties();
  4.                
  5.                 jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
  6.                 jndiProperties.put(Context.PROVIDER_URL, "http//localhost");
  7.                 initialContext = new InitialContext(jndiProperties);
  8.         }



Invece che @AfterAll forse dovresti usare @Before?


Il mio blog: https://piero.dev
PM Quote
Avatar
Sevenjeak (Normal User)
Pro


Messaggi: 91
Iscritto: 03/01/2012

Segnala al moderatore
Postato alle 16:08
Mercoledì, 24/01/2018
Ops.. Scusate, errore mio, per sbaglio ho invertito l'annotazione @AfterAll ( eseguita dopo i test ) con @BeforeAll ( eseguita prima dei test ).

Comunque ora non sono al pc, non potrei modificare il codice, ti faro sapere nel caso mi si presente un'altro errore, intando grazie per la risposta.

EDIT:

Ho corretto l'errore che avevo fatto invertendo l'annotazione @AfterAll con @BeforeAll, ho anche modificato il session bean, mi sono accordo di aver fatto degli errori di calcolo :d.

Purtroppo ora, JUnit, nella Failure list mi da questi errori:

Codice sorgente - presumibilmente Delphi

  1. javax.naming.NameNotFoundException: WFNAM00004: Name "global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote" is not found
  2.         at org.wildfly.naming.client.util.NamingUtils$1.lookupNative(NamingUtils.java:95)
  3.         at org.wildfly.naming.client.AbstractContext.lookup(AbstractContext.java:84)
  4.         at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:144)
  5.         at javax.naming.InitialContext.lookup(Unknown Source)
  6.         at test.IntegrationTest.test(IntegrationTest.java:33)
  7.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  8.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  9.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  10.         at java.lang.reflect.Method.invoke(Unknown Source)
  11.         at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)
  12.         at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
  13.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167)
  14.         at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
  15.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
  16.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
  17.         at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
  18.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83)
  19.         at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
  20.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
  21.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
  22.         at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
  23.         at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
  24.         at java.util.Iterator.forEachRemaining(Unknown Source)
  25.         at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
  26.         at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
  27.         at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
  28.         at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
  29.         at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
  30.         at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
  31.         at java.util.stream.ReferencePipeline.forEach(Unknown Source)
  32.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
  33.         at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
  34.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
  35.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
  36.         at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
  37.         at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source)
  38.         at java.util.Iterator.forEachRemaining(Unknown Source)
  39.         at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
  40.         at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
  41.         at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
  42.         at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
  43.         at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
  44.         at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
  45.         at java.util.stream.ReferencePipeline.forEach(Unknown Source)
  46.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
  47.         at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
  48.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
  49.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
  50.         at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
  51.         at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
  52.         at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
  53.         at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
  54.         at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:82)
  55.         at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  56.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
  57.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
  58.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
  59.         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)



Da quello che ho capito non mi trova il riferimento jndi dell'interfaccia remota ( global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote ), anche se mi sembra strano, anche perché quando avvio il server, sulla console mi stampa i riferimenti jndi del server ( riferimento che ho copiato da la ), come mai all'ora non mi trova l'interfaccia?

Ultima modifica effettuata da Sevenjeak il 25/01/2018 alle 10:49
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 15:48
Mercoledì, 21/03/2018
Ciao,

riassumo in breve i passaggi da effettuare per la chiamata da un client (Main java).

1) Aggiunta di un utenza applicativa su wildfly di tipo B e che possa utilizzare gli Ejb (ultimo step rispondere yes).
Mediante la utility wildfly/bin/add-user.sh

Doc https://docs.jboss.org/author/display/WFLY8/add-user+utility

2) Aggiungere in src (o alytra basta che venga inserita nel jar) un file chiamato jboss-ejb-client.properties, con il seguente contenuto:
Codice sorgente - presumibilmente Plain Text

  1. remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
  2. remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
  3. remote.connections=default
  4. remote.connection.default.host=127.0.0.1
  5. remote.connection.default.port=8080
  6. remote.connection.default.username=ejb
  7. remote.connection.default.password=123



Dove ejb e 123 è il profilo utente aggiunto al punto 1).

Aggiungere il jar wildfly/bin/client/jboss-client.jar al class-path del progetto

Vedi screnn1.jpg per un esempio di progetto

3) Come fare il lookup
Codice sorgente - presumibilmente Java

  1. static TestRemote lookup() throws NamingException {
  2.  
  3.                 final Hashtable<Object, Object> jndiProperties = new Hashtable<Object, Object>();
  4.                 jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
  5.                 jndiProperties.put("jboss.naming.client.ejb.context", true);
  6.  
  7.                 final String appName = "MyProjectEar"; //ear
  8.                 final String moduleName = "MyEjbs";     //ejb.jar
  9.                 final String distinctName = "";
  10.                 final String beanName = "Test";              //ejb name
  11.  
  12.                 final String viewClassName = "com.test.TestRemote"; // interfaccia da usare
  13.                 System.out.println("Looking EJB via JNDI ");
  14.  
  15.                 // NB start with --> ejb:
  16.                 final String jndi = String.format("ejb:%s/%s/%s/%s!%s", appName, moduleName, distinctName, beanName,
  17.                                 viewClassName);
  18.  
  19.                 System.out.println("jndi = " + jndi);
  20.  
  21.                 return (TestRemote) new InitialContext(jndiProperties).lookup(jndi);
  22.  
  23.         }



Doc https://docs.jboss.org/author/display/WFLY8/EJB+invocations ...

Il link della doc riferiscono alla versione 8 di wildfly, vale anche per 9/10 per le successive devo verificare ma credo che sia rimasto così.

Buon divertimento :)


Bonny ha allegato un file: screen1.jpg (16574 bytes)
Clicca qui per guardare l'immagine
PM Quote